package com.tanhua.server.serivce;


import com.tanhua.dubbo.api.UserFreezeApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.mongo.LockMassage;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserFreezeService {

    @DubboReference
    private UserFreezeApi userFreezeApi;
    @DubboReference
    private UserInfoApi userInfoApi;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    //判断用户是否处于被冻结状态
    public boolean isFreezing(Long userId, Integer freezingRange) {
        UserInfo userInfo = userInfoApi.findById(userId);
        if (userInfo != null) {
            String userStatus = userInfo.getUserStatus();
            //如果用户状态为冻结状态
            if (userStatus.equals("2")) {
                //通过userId查询用户的冻结相关数据
                LockMassage userFreeze = userFreezeApi.findByUserId(userId);
                //如果冻结范围的值与当前用户所使用功能相符(1:登录 2:发言 3:发动态)，就继续再判断是否已经过了冻结的终止时间
                if (userFreeze.getFreezingRange().equals(freezingRange)) {
                    //1.从redis缓存中获取冻结终止时间
                    String thawingTimeStr = redisTemplate.opsForValue().get("user_freeze_" + userId);
                    if(thawingTimeStr == null) {
                        //如果获取不到冻结终止时间，说明是永久冻结，直接返回true，表示用户处于冻结状态
                        return true;
                    }
                    Long thawingTime = Long.valueOf(thawingTimeStr);
                    //2.与当前时间作比较
                    if (System.currentTimeMillis() > thawingTime) {
                        //如果当前时间毫秒值大于冻结终止时间的毫秒值，就说明用户已经解冻，要把用户的冻结状态改回正常状态，并且放行用户登录
                        //修改用户在tb_user_info表里的user_status值，改成1(正常状态)
                        userInfo.setUserStatus("1");
                        userInfoApi.update(userInfo);
                        //删除mongo中user_freeze表的数据
                        userFreezeApi.delete(userId);
                        //删除redis中冻结终止时间的缓存数据
                        redisTemplate.delete("user_freeze_" + userId);
                    } else {
                        //如果当前时间毫秒值小于冻结终止时间的毫秒值，就返回true，表示用户还处于冻结状态，
                        return true;
                    }
                }
            }
        }
        //如果最终返回false，表示用户处于正常状态
        return false;
    }
}
